home *** CD-ROM | disk | FTP | other *** search
/ Zoom 2 / Zoom - Release 2 (1996)(Active Software)[!].iso / programming / assembly / ex4_number3 / morphcode.s < prev    next >
Encoding:
Text File  |  1992-09-02  |  8.9 KB  |  558 lines

  1.  
  2. **********************
  3. ; The framework in this source is appauling.. If you intend to use this
  4. ; you are well advised to replace it with a decent one.. See other examples
  5. ; on previous coders disks or look at HOW TO CODE 4...
  6. ;
  7. ; 'AGA Copper corruption Fix - (Botch style method - cheap and dirty)
  8. ; 'Absolute Address references to chipmemory at location $b0000 REMOVED!
  9. ; 'Seem`s to work sort of okay now but your better off with a decent frame! 
  10. *********************
  11. ;
  12.  
  13. ; This just uses to GFX piccys to morph between, it uses 20 frames, and
  14. ; you can change the FrameHeight...
  15.  
  16. ;    Opt    c-
  17.     Section    "Morpher Code",Code_c
  18.  
  19. FrameHeight    = 128
  20. FrameSize    = (32*FrameHeight)
  21.  
  22.             IncDir    ram:
  23.  
  24. start            movem.l    d0-d7/a0-a6,-(sp) 
  25.             bsr    killsys      
  26.     
  27.             lea    copperlist(pc),a0 
  28.             lea    hardware,a6      
  29.             move.l    a0,cop1lc(a6)      
  30.             move.w    #$83c0,dmacon(a6)
  31.  
  32.             Move.l    FrameStart(pc),a0
  33.             Lea    FirstPiccy(pc),a1
  34.             Bsr    CopyPiccy
  35.  
  36.             Move.l    FrameEnd(pc),a0
  37.             Lea    LastPiccy(pc),a1
  38.             Bsr    CopyPiccy
  39.  
  40.             Move.l    FrameEnd(pc),a0
  41.             Add.l    #FrameSize,a0
  42.             Lea    LastPiccy(pc),a1    
  43.             Bsr    CopyPiccy
  44.  
  45.             Lea    ColourZero+2(pc),a0
  46.             Move.w    #$000,(a0)    
  47.             Bsr    DoMorph
  48.             Lea    ColourZero+2(pc),a0
  49.             Move.w    #$000,(a0)
  50.  
  51. Loop:            Bsr    Anim8
  52.             Btst    #6,$Bfe001      
  53.             Bne.s    Loop      
  54.         
  55.             Bsr    ReturnSys      
  56.             Movem.l    (sp)+,d0-d7/a0-a6 
  57.             moveq    #0,d0      
  58.             Rts
  59.  
  60. Anim8    Lea    Screen,a0
  61.     Lea    CopperBPLS(pc),a1
  62.     Move.w    #21,d7
  63. AnimLoop    Move.l    a0,d1
  64.     Move.w    d1,6(a1)
  65.     Swap    d1
  66.     Move.w    d1,2(a1)
  67.     Bsr    VBL
  68.     Move.w    #$4000,d0
  69. Wait    Dbf    d0,Wait
  70.     Bsr    VBL
  71.  
  72.     Btst    #6,$Bfe001
  73.     Beq    ExitAnim8
  74.     Add.l    #FrameSize,a0
  75.     Dbf    d7,AnimLoop
  76.         
  77.     Bsr    Pause
  78.     
  79.     Sub.l    #FrameSize,a0
  80.     
  81.     Move.w    #21,d7
  82. AnimLoop1    Move.l    a0,d1
  83.     Move.w    d1,6(a1)
  84.     Swap    d1
  85.     Move.w    d1,2(a1)
  86.     Bsr    VBL
  87.     Move.l    #$4000,d0
  88. Wait1    Dbf    d0,Wait1
  89.     Bsr    VBL
  90.     Btst    #6,$Bfe001
  91.     Beq    ExitAnim8
  92.     Sub.l    #FrameSize,a0
  93.     Dbf    d7,AnimLoop1
  94.     
  95.     Bsr    Pause
  96. ExitAnim8    Rts
  97.  
  98. Pause    Move.w    #10,d3
  99. WaitX1    Bsr    VBL
  100.     Move.w    #$2000,d0
  101. WaitX    Btst    #2,$Dff016
  102.     Beq    ExitPause
  103.     Btst    #6,$Bfe001
  104.     Beq    ExitAnim8
  105.     Dbf    d0,WaitX
  106.     Bsr    VBL
  107.     Dbf    d3,WaitX1
  108. ExitPause    Rts
  109.  
  110. VBL    Move.l    $Dff004,d0
  111.     And.l    #$1ff00,d0
  112.     Cmp.l    #$13000,d0
  113.     Bne    VBL
  114.     Rts
  115.  
  116. CopyPiccy    Move.w    #(FrameSize/4)-1,d0
  117. CopyPicLoop    Move.l    (a1)+,(a0)+
  118.     Dbf    d0,CopyPicLoop
  119.     Rts
  120.  
  121. DoMorph    Lea    MorphDatList(pc),a0
  122.     Move.l    #$ffff0000,$00(a0)
  123.     Move.l    #$ffff0000,$04(a0)
  124.     Move.l    #$ffff0000,$82(a0)
  125.     Move.l    #$ffff0000,$86(a0)
  126.  
  127.     Lea    FrameList(pc),a0
  128.     Move.w    #18,d0
  129. FrameCLear    Move.w    #(FrameSize/4)-1,d1
  130.     Move.l    (a0)+,a1
  131. GFXCLearLoop    Move.l    #0,(a1)+
  132.     Dbf    d1,GFXCLearLoop
  133.     Dbf    d0,FrameCLear
  134.  
  135.     Move.l    FrameStart(pc),a0
  136.     Move.l    FrameEnd(pc),a1
  137.     Lea    MorphDatList+4(pc),a2
  138.     Lea    MorphDatList+$86(pc),a3
  139.     Lea    MorphFlag(pc),a6
  140.     Or.b    #3,(a6)
  141. MorphFrame    Move.w    (a2)+,d0
  142.     Bge    DoFrameDat1
  143.     Bra    CalcFrame
  144.  
  145. GetFrame    Lea    MorphDatList(pc),a2
  146.     Bra    MorphFrame
  147.  
  148. DoFrameDat1    Move.w    (a2)+,d1
  149. DoFrameDat2    Move.w    (a3)+,d2
  150.     Bge    CreateFrame
  151.     Bra    CalcFrame1
  152.  
  153. GetHalfData    Lea    MorphDatList+$82(pc),a3
  154.     Bra    DoFrameDat2
  155.  
  156. CreateFrame    Move.w    (a3)+,d3
  157.     Move.l    a0,-(sp)
  158.     Lea    PosTabList(pc),a0
  159.     Sub.w    d0,d2
  160.     Sub.w    d1,d3
  161.     Lsl.w    #5,d2
  162.     Lsl.w    #5,d3
  163.     Lea    FrameList(pc),a4
  164.     Lea    MorphBitList(pc),a6
  165.     Move.w    #19,d7
  166.     Tst.w    d2
  167.     Bmi    MorphDat2
  168.     Tst.w    d3
  169.     Bmi    MorphDat1
  170. FrameAddrLoop    Move.l    (a4)+,a5
  171.     Add.b    0(a6,d2.w),d0
  172.     Add.b    0(a6,d3.w),d1
  173.     Move.w    d1,d4
  174.     Add.w    d4,d4
  175.     Move.w    0(a0,d4.w),d4
  176.     Move.w    d0,d5
  177.     Asr.w    #3,d5
  178.     Add.w    d5,d4
  179.     Moveq.l    #7,d5
  180.     Sub.w    d0,d5
  181.     Bset    d5,0(a5,d4.w)
  182.     Addq.w    #1,a6
  183.     Dbf    d7,FrameAddrLoop
  184.     Move.l    (sp)+,a0
  185.     Bra    MorphFrame
  186.  
  187. MorphDat1    Neg.w    d3
  188. DoMorphSeg1    Move.l    (a4)+,a5
  189.     Add.b    0(a6,d2.w),d0
  190.     Sub.b    0(a6,d3.w),d1
  191.     Move.w    d1,d4
  192.     Add.w    d4,d4
  193.     Move.w    0(a0,d4.w),d4
  194.     Move.w    d0,d5
  195.     Asr.w    #3,d5
  196.     Add.w    d5,d4
  197.     Moveq.l    #7,d5
  198.     Sub.w    d0,d5
  199.     Bset    d5,0(a5,d4.w)
  200.     Addq.w    #1,a6
  201.     Dbf    d7,DoMorphSeg1
  202.     Move.l    (sp)+,a0
  203.     Bra    MorphFrame
  204.  
  205. MorphDat2    Neg.w    d2
  206.     Tst.w    d3
  207.     Bmi    MorphDat3
  208. DoMorphSeg2    Move.l    (a4)+,a5
  209.     Sub.b    0(a6,d2.w),d0
  210.     Add.b    0(a6,d3.w),d1
  211.     Move.w    d1,d4
  212.     Add.w    d4,d4
  213.     Move.w    0(a0,d4.w),d4
  214.     Move.w    d0,d5
  215.     Asr.w    #3,d5
  216.     Add.w    d5,d4
  217.     Moveq.l    #7,d5
  218.     Sub.w    d0,d5
  219.     Bset    d5,0(a5,d4.w)
  220.     Addq.w    #1,a6
  221.     Dbf    d7,DoMorphSeg2
  222.     Move.l    (sp)+,a0
  223.     Bra    MorphFrame
  224.  
  225. MorphDat3    Neg.w    d3
  226. DoMorphSeg3    Move.l    (a4)+,a5
  227.     Sub.b    0(a6,d2.w),d0
  228.     Sub.b    0(a6,d3.w),d1
  229.     Move.w    d1,d4
  230.     Add.w    d4,d4
  231.     Move.w    0(a0,d4.w),d4
  232.     Move.w    d0,d5
  233.     Asr.w    #3,d5
  234.     Add.w    d5,d4
  235.     Moveq.l    #7,d5
  236.     Sub.w    d0,d5
  237.     Bset    d5,0(a5,d4.w)
  238.     Addq.w    #1,a6
  239.     Dbf    d7,DoMorphSeg3
  240.     Move.l    (sp)+,a0
  241.     Bra    MorphFrame
  242.  
  243. CalcFrame    Lea    MorphDatList(pc),a2
  244.     Move.w    (a2),d4
  245.     Move.w    2(a2),d5
  246.     And.w    #$ffe0,d4
  247. DrawData    Add.w    #$20,d4
  248.     Cmp.w    #$100,d4
  249.     Bne    EndPosTab
  250.     Moveq.l    #0,d4
  251.     Addq.w    #1,d5
  252.     Cmp.w    #FrameHeight,d5
  253.     Bne    EndPosTab
  254.     Moveq.l    #0,d5
  255.     Lea    MorphFlag(pc),a6
  256.     And.b    #$fe,(a6)
  257.     Tst.b    (a6)
  258.     Beq    EndByteDraw
  259.     Move.l    FrameStart(pc),a0
  260. EndPosTab    Move.l    (a0)+,d7
  261.     Beq    DrawData
  262.     Moveq.l    #$1f,d6
  263. TestDrawBit    Btst    d6,d7
  264.     Beq    NoDrawByte
  265.     Move.w    d4,(a2)+
  266.     Move.w    d5,(a2)+
  267. NoDrawByte    Addq.w    #1,d4
  268.     Dbf    d6,TestDrawBit
  269.     Move.w    #$ffff,(a2)
  270.     Bra    GetFrame
  271.  
  272. CalcFrame1    Lea    MorphDatList+$82(pc),a3
  273.     Move.w    (a3),d4
  274.     Move.w    2(a3),d5
  275.     And.w    #$ffe0,d4
  276. DrawData1    Add.w    #$20,d4
  277.     Cmp.w    #$100,d4
  278.     Bne    EndPosTab2
  279.     Moveq.l    #0,d4
  280.     Addq.w    #1,d5
  281.     Cmp.w    #FrameHeight,d5
  282.     Bne    EndPosTab2
  283.     Moveq.l    #0,d5
  284.     Lea    MorphFlag(pc),a6
  285.     And.b    #$fd,(a6)
  286.     Tst.b    (a6)
  287.     Beq    EndByteDraw
  288.     Move.l    FrameEnd(pc),a1
  289. EndPosTab2    Move.l    (a1)+,d7
  290.     Beq    DrawData1
  291.     Moveq.l    #$1f,d6
  292. TestNextDraw    Btst    d6,d7
  293.     Beq    NoByteDraw
  294.     Move.w    d4,(a3)+
  295.     Move.w    d5,(a3)+
  296. NoByteDraw    Addq.w    #1,d4
  297.     Dbf    d6,TestNextDraw
  298.     Move.w    #$ffff,(a3)
  299.     Bra    GetHalfData 
  300. EndByteDraw    Rts    
  301.  
  302. KillSys    Bsr.s    SysWait    
  303.  
  304.     Move.l    $4,a6    
  305.     Lea    GFXName(pc),a1    
  306.     Moveq    #0,d0    
  307.     Jsr    -552(a6)    
  308.         
  309.     Lea    OldCop1(pc),a5
  310.     Move.l    $26(a0),$0(a5)    
  311.     Move.l    $32(a0),$4(a5)    
  312.     
  313.     Lea    HardWare,a6
  314.     Move.w    IntEnaR(a6),d0    
  315.     Move.w    DMAConR(a6),d1  
  316.     Or.w    #$8000,d0    
  317.     And.w    #$03ff,d1    
  318.     Or.w    #$8000,d1    
  319.     Move.w    d0,$8(a5)    
  320.     Move.w    d1,$a(a5)    
  321.     
  322.     Move.w    #$7fff,IntEna(a6) 
  323.     Move.w    #$7fff,DMACon(a6) 
  324.     Rts
  325.  
  326. SysWait    Move.w    #15,d7    
  327. SysWaitLoop    Move.l    #$05000,d1    
  328.     Bsr.s    WaitVBL    
  329.     Bsr.s    DoWaitVBL    
  330.     Dbf    d7,SysWaitLoop    
  331.     Rts
  332.  
  333. DoWaitVBL    Move.l    #$03000,d1    
  334. WaitVBL    Movem.l    d0-d1/a6,-(sp)    
  335.     Lea    HardWare,a6    
  336. WaitVBLLoop    Move.l    VPosR(a6),d0    
  337.     And.l    #$1ff00,d0    
  338.     Cmp.l    d1,d0    
  339.     Bne.s    WaitVBLLoop    
  340.     Movem.l    (sp)+,d0-d1/a6    
  341.     Rts        
  342.  
  343. ReturnSys    Lea    HardWare,a6    
  344.     Move.w    OldIntEna(pc),IntEna(a6)
  345.     Move.w    OldDMACon(pc),DMACon(a6)
  346.     Move.l    OldCop1(pc),Cop1lc(a6)
  347.     Move.l    OldCop2(pc),Cop2lc(a6)
  348.     Rts
  349.  
  350. GFXName    Dc.b    "graphics.library",0
  351.     Even
  352. OldCop1    Dc.l    0    
  353. OldCop2    Dc.l    0    
  354. OldIntEna    Dc.w    0    
  355. OldDmaCon    Dc.w    0    
  356.  
  357. MorphFlag    Dc.w    0
  358. FrameStart    Dc.l    Screen
  359. FrameList    
  360. A Set FrameSize
  361.     Rept    19
  362.     Dc.l    Screen+A
  363. A Set A+FrameSize
  364.     Endr
  365. FrameEnd    Dc.l    Screen+A
  366.  
  367. Cmv    Macro
  368.     Dc.w    \2,\1
  369.     EndM
  370.     
  371. Cwt    Macro
  372.     Dc.w    (\1*$100)+$01,$fffe
  373.     EndM    
  374.  
  375. Pal    Macro
  376.     Dc.w    $ffe1,$fffe
  377.     EndM    
  378.  
  379. EndCop    Macro
  380.     Dc.w    $ffff,$fffe
  381.     EndM    
  382.  
  383. CopperList    Cwt    $15    
  384.     Cmv    $0200,BplCon0    
  385.     Cmv    $00bb,BplCon1    
  386.     Cmv    $000a,BplCon2    
  387.     Cmv    $0040,DdfStrt    
  388.     Cmv    $00b8,DdfStop    
  389.     Cmv    $169e,DiwStrt    
  390.     Cmv    $36a3,DiwStop
  391.     Cmv    $0,BplMod1    
  392.     Cmv    $0,BplMod2    
  393.     dc.w    $1fc,0,$106,0
  394.     Cwt    $25        
  395. ColourZero    Cmv    $0000,Color00    
  396.     Cmv    $0fff,Color01
  397.     
  398. CopperBPLS    Cmv    $a,BplPt0h    
  399.     Cmv    $0,BplPt0l    
  400.     Cmv    $0,BplPt1h    
  401.     Cmv    $0,BplPt1l    
  402.     Cmv    $0,BplPt2h    
  403.     Cmv    $0,BplPt2l    
  404.     Cmv    $0,BplPt3h    
  405.     Cmv    $0,BplPt3l    
  406.     Cmv    $0,BplPt4h
  407.     Cmv    $0,BplPt4l 
  408.     
  409.     Cwt    $28    
  410.     Cmv    $1200,BplCon0    
  411.  
  412.     Cwt    $a7
  413.     Cmv    $0200,BplCon0    
  414.     
  415.     Pal
  416.     Cwt    $28    
  417.     Cmv    $0200,BplCon0
  418.                     
  419.     EndCop    
  420.             cnop    0,4
  421. MorphDatList    Incbin    Morph3e60c.Dat
  422.             cnop    0,4
  423. PosTabList    Incbin    PosTab.Dat
  424.             cnop    0,4
  425. MorphBitList    Incbin    MorphBitTab.Dat
  426.             cnop    0,4
  427. FirstPiccy    Incbin    FirstFrame.Raw
  428.             Ds.b    $3000
  429.             cnop    0,4
  430. LastPiccy    Incbin    LastFrame.Raw
  431.             Ds.b    $3000
  432. Screen:        ds.b 10240*4        ;$b0000
  433.  
  434. ****Custom Chip Registers****
  435.  
  436. Hardware    = $Dff000
  437.  
  438. ;Control Registers
  439.  
  440. Dmaconr    = $002
  441. Vposr    = $004
  442. Vhposr    = $006
  443. Joy0dat    = $00A
  444. Joy1dat    = $00C
  445. Clxdat    = $00E
  446. Intenar    = $01C
  447. Intereqr    = $01E
  448. Copcon    = $02E
  449.  
  450. ;Blitter Registers
  451.  
  452. Bltcon0    = $040
  453. Bltcon1    = $042
  454. Bltafwm    = $044
  455. Bltalwm    = $046
  456. Bltcpth    = $048
  457. Bltcptl    = $04A
  458. Bltbpth    = $04C
  459. Bltbptl    = $04E
  460. Bltapth    = $050
  461. Bltaptl    = $052
  462. Bltdpth    = $054
  463. Bltdptl    = $056
  464. Bltsize    = $058
  465. Bltcmod    = $060
  466. Bltbmod    = $062
  467. Bltamod    = $064
  468. Bltdmod    = $066
  469. Bltcdat    = $070
  470. Bltbdat    = $072
  471. Bltadat    = $074
  472.  
  473. ;Copper Registers
  474.  
  475. Cop1lc    = $080
  476. Cop1lch    = $080
  477. Cop1lcl    = $082
  478. Cop2lc    = $084
  479. Cop2lch    = $084
  480. Cop2lcl    = $086
  481. Copjmp1    = $088
  482. Copjmp2    = $08A
  483. Diwstrt    = $08E
  484. Diwstop    = $090
  485. Ddfstrt    = $092
  486. Ddfstop    = $094
  487. Dmacon    = $096
  488. Clxcon    = $098
  489. Intena    = $09A
  490. Intreq    = $09C
  491.  
  492. ;BitPlane Registers 
  493.  
  494. BplCon0    = $100
  495. BplCon1    = $102
  496. BplCon2    = $104
  497. BplMod1    = $108
  498. BplMod2    = $10a
  499.  
  500. BplPt0h    = $0e0
  501. BplPt0l    = $0e2
  502. BplPt1h    = $0e4
  503. BplPt1l    = $0e6
  504. BplPt2h    = $0e8
  505. BplPt2l    = $0ea
  506. BplPt3h    = $0ec
  507. BplPt3l    = $0ee
  508. BplPt4h    = $0f0
  509. BplPt4l    = $0f2
  510. BplPt5h    = $0f4
  511. BplPt5l    = $0f6
  512.  
  513. ;Colour Registers
  514.  
  515. Color00    = $180
  516. Color01    = $182
  517. Color02    = $184
  518. Color03    = $186
  519. Color04    = $188
  520. Color05    = $18a
  521. Color06    = $18c
  522. Color07    = $18e
  523. Color08    = $190
  524. Color09    = $192
  525. Color10    = $194
  526. Color11    = $196
  527. Color12    = $198
  528. Color13     = $19a
  529. Color14     = $19c
  530. Color15     = $19e
  531. Color16     = $1a0
  532. Color17     = $1a2
  533. Color18     = $1a4
  534. Color19     = $1a6
  535. Color20     = $1a8
  536. Color21     = $1aa
  537. Color22     = $1ac
  538. Color23     = $1ae
  539. Color24     = $1b0
  540. Color25     = $1b2
  541. Color26     = $1b4
  542. Color27     = $1b6
  543. Color28     = $1b8
  544. Color29     = $1ba
  545. Color30     = $1bc
  546. Color31     = $1be
  547.  
  548. EcsNop    = $1fe
  549.  
  550.  
  551.  
  552.  
  553.  
  554.  
  555.  
  556.  
  557.  
  558.